
package appgrafica1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


public class HeuristicSearch {
    public HeuristicSearch()
    {
    }
    public static NodoArbol HillClimbing(ArbolBinario tree,int EstadoInicial,int Objetivo,int criterio)
    {
        NodoArbol actual=null,izq,der;
        if(tree.Busqueda(tree,EstadoInicial) && tree.Busqueda(tree,Objetivo))
        {
            actual = tree.BuscarNodo(tree,EstadoInicial);
            if(actual.dato==Objetivo)
                return actual;
            else
            {
                while(actual!=null)
                {
                    izq=actual.HijoIzq;
                    der=actual.HijoDer;
                    if(izq!=null && izq.dato==Objetivo)
                        return izq;
                    else if(der!=null && der.dato==Objetivo)
                        return der;
                    else if(criterio == 1)
                    {
                        if(izq.dato>der.dato)
                            actual=izq;
                        else
                            actual=der;
                    }
                    else
                    {
                        if(izq.dato<der.dato)
                            actual=izq;
                        else
                            actual=der;
                    }
                }
            }
        }
        return actual;
    }
    public static ArrayList BackTrack(ArbolBinario tree,int inicial,int meta)
    {
        int cs=inicial;
        ArrayList sl= new ArrayList(new Integer(inicial));
        ArrayList nsl=new ArrayList(new Integer(inicial));
        ArrayList de=new ArrayList();
        //Asumo que el inicio y el fin ya se encuentran
        //en el Arbol....
        NodoArbol nodo=null;
        while(!nsl.isEmpty())
        {
            if(cs==meta)
                return sl;
            nodo=tree.BuscarNodo(tree, cs);
            if(nodo.HijoDer==null && nodo.HijoIzq==null)
            {
                while(!sl.isEmpty()&& cs==(Integer)sl.get(0))
                {
                    de.add(cs);
                    sl.remove(0);
                    nsl.remove(0);
                    cs=(Integer)nsl.get(0);
                }
                sl.add(new Integer(cs));
            }
            else
            {
                nsl.add(new Integer(nodo.HijoDer.dato));
                nsl.add(new Integer(nodo.HijoIzq.dato));
                cs=(Integer)nsl.get(0);
                sl.add(new Integer(cs));
            }
        }
        return null;
    }

//    Metodo que abre un archivo txt(laberinto.txt)
//    y lo lee
    public static  void LeerArchivo()
    {
        File file=new File("C:/Users/Home/Desktop/labe.txt");
        BufferedReader entrada;
       
        try
        {
            entrada = new BufferedReader( new FileReader( file ) );
            String linea;
            int y = 0 ;
            while(entrada.ready())
            {
                linea = entrada.readLine();
                System.out.println(linea);
                
                char[] caracteres = linea.toCharArray();
                
                for(int x = 0 ; x < caracteres.length ; x++){
                
                    char c =  caracteres[x];
                    
                    if(c == '#'){
                    
                        Pared p = new Pared();
                        p.posicion.x = x ;
                        p.posicion.y = y ;
                        Main.paredes.add(p);
                    }
                    if(c == '.'){
                        Deposito d = new Deposito();
                        d.posicion.x = x ;
                        d.posicion.y = y ;
                       Main.depositos.add(d);
                    }
                    if(c == '+'){
                    
                        Hombre h = new Hombre();
                        h.posicion.x = x ;
                        h.posicion.y = y ;
                        Main.hombre = h ;
                    }
                    if(c == 'o'){
                    
                        Bloque b = new Bloque();
                        b.posicion.x = x ;
                        b.posicion.y = y ;
                        Main.bloques.add(b);
                    }
                    if(c == ' '){
                    
                        Espacios es = new Espacios();
                        es.posicion.x = x ;
                        es.posicion.y = y ;
                        Main.espacios.add(es);
                    }
                }
                 y++;
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
      
    }

}